# Based on the works of https://github.com/AlessandroZ/LaZagne/blob/master/Windows/lazagne/
import win32crypt
import os, base64
import xml.etree.cElementTree as ET


class Cyberduck():
    def __init__(self):
        pass

    # find the user.config file containing passwords
    def get_path(self):
        if 'APPDATA' in os.environ:
            directory = os.environ['APPDATA'] + '\Cyberduck'

            if os.path.exists(directory):
                for dir in os.listdir(directory):
                    if dir.startswith('Cyberduck'):
                        for d in os.listdir(directory + os.sep + dir):
                            path = directory + os.sep + dir + os.sep + d + os.sep + 'user.config'
                            if os.path.exists(path):
                                return path

                return 'User_profil_not_found'
            else:
                return 'CYBERDUCK_NOT_EXISTS'
        else:
            return 'APPDATA_NOT_FOUND'

    # parse the xml file
    def parse_xml(self, xml_file):
        tree = ET.ElementTree(file=xml_file)

        pwdFound = []
        for elem in tree.iter():
            values = {}
            try:
                if elem.attrib['name'].startswith('ftp') or elem.attrib['name'].startswith('ftps') or elem.attrib[
                    'name'].startswith('sftp') or elem.attrib['name'].startswith('http') or elem.attrib[
                    'name'].startswith('https'):
                    values['URL'] = elem.attrib['name']
                    encrypted_password = base64.b64decode(elem.attrib['value'])
                    password = win32crypt.CryptUnprotectData(encrypted_password, None, None, None, 0)[1]
                    values['Password'] = password

                    pwdFound.append(values)
            except Exception, e:
                pass

        # print the results
        return pwdFound

    # main function
    def run(self):

        path = self.get_path()
        if path == 'CYBERDUCK_NOT_EXISTS':
            pass
        elif path == 'User_profil_not_found':
            pass
        elif path == 'APPDATA_NOT_FOUND':
            pass
        else:
            pwd_found = self.parse_xml(path)
            return pwd_found

#tem = Cyberduck()
#a = tem.run()
#print a
